
#pragma once

#include "impl.h"

/******************************************************************************
 *
 * static rules
 *
 ******************************************************************************/

/*
 * call pattern:
 * ({func-name} (match-pattern) :vars (var-list))
 *
 * returns:
 * matched lists results in a single list
 */
Obj *
f_match( void * tag, List * args );

/*
 * call pattern:
 * ({func-name} (rule1) (rule2) ... (ruleN))
 *
 * returns:
 * t - if all rules added
 * nil - if at least one rule already exists
 */
Obj *
f_def_static_rules( void * tag, List * args );

Obj *
f_get_static_rules( void * tag, List * args );

/******************************************************************************
 *
 * dynamic rules
 *
 ******************************************************************************/

/*
 * defines dynamic rule
 *
 * returns:
 * NIL if rule with the same pattern was introduced before
 */
Obj *
f_def_dynamic_rule( void * tag, List * args );

/*
 * call pattern:
 * ({func-name} rule-name)
 */
Obj *
f_get_dynamic_rule( void * tag, List * args );

/*
 * applies dynamic rule
 * call pattern:
 * ({f} rule-name)
 */
Obj *
f_apply_dynamic_rule( void * tag, List * args );

/******************************************************************************
 *
 * namespaces
 *
 ******************************************************************************/

/*
 * sets default namespace used while reading current stream
 *
 * call pattern:
 * ({func-name} id-namespace-name)
 *
 * returns:
 * namespace, that was previously set
 */
Obj *
f_set_namespace( void * tag, List * args );

Obj *
f_get_namespace( void * tag, List * args );

/******************************************************************************
 *
 * variables
 *
 ******************************************************************************/

/*
 * assigns a variable
 *
 * call pattern:
 * ({func-name} id value)
 *
 * returns:
 * value, that was aliased to the id given
 */
Obj *
f_setvar( void * tag, List * args );

/******************************************************************************
 *
 * working with files
 *
 ******************************************************************************/

/*
 * call pattern:
 * ({func-name} string-name)
 * ({func-name} :name string-name :verbose t/nil)
 *
 * returns:
 * result of the last evaluation
 */
Obj *
f_load( void * tag, List * args );


/******************************************************************************
 *
 * logic
 *
 ******************************************************************************/

Obj *
f_eq( void * tag, List * args );

Obj *
f_greater( void * tag, List * args );

Obj *
f_less( void * tag, List * args );

Obj *
f_greater_or_equal( void * tag, List * args );

Obj *
f_less_or_equal( void * tag, List * args );

Obj *
f_if( void * tag, List * args );

Obj *
f_cond( void * tag, List * args );

/******************************************************************************
 *
 * misc
 *
 ******************************************************************************/
 
/*
 * prints arguments being passed
 * call pattern:
 * ({f} args...)
 * returns:
 * nil
 */
Obj *
f_print( void * tag, List * args );

/*
 * emits stop error
 */
Obj *
f_quit( void * tag, List * args );

/*
 * emits stop error
 */
Obj *
f_progn( void * tag, List * args );

